Reactãšãã§ã¯ãã®ã¯ãªãŒã³ã¢ãã颿°ã广çã«äœ¿çšããŠãã¡ã¢ãªãªãŒã¯ãé²ããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæé©åããæ¹æ³ãåŠã³ãŸããããReactéçºè åãã®å æ¬çãªã¬ã€ãã§ãã
Reactãšãã§ã¯ãã®ã¯ãªãŒã³ã¢ããïŒã¡ã¢ãªãªãŒã¯é²æ¢ããã¹ã¿ãŒãã
Reactã®useEffect
ããã¯ã¯ã颿°ã³ã³ããŒãã³ãã§å¯äœçšã管çããããã®åŒ·åãªããŒã«ã§ããããããæ£ãã䜿çšããªããšã¡ã¢ãªãªãŒã¯ãåŒãèµ·ãããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãšå®å®æ§ã«åœ±é¿ãäžããå¯èœæ§ããããŸãããã®å
æ¬çãªã¬ã€ãã§ã¯ãReactãšãã§ã¯ãã®ã¯ãªãŒã³ã¢ããã®è€éããæãäžããã¡ã¢ãªãªãŒã¯ãé²ããããå
ç¢ãªReactã¢ããªã±ãŒã·ã§ã³ãäœæããããã®ç¥èãšå®è·µçãªäŸãæäŸããŸãã
ã¡ã¢ãªãªãŒã¯ãšã¯äœãããªãåé¡ãªã®ãïŒ
ã¡ã¢ãªãªãŒã¯ã¯ãã¢ããªã±ãŒã·ã§ã³ãã¡ã¢ãªãå²ãåœãŠãåŸãäžèŠã«ãªã£ããšãã«ã·ã¹ãã ã«è§£æŸããªãã£ãå Žåã«çºçããŸããæéã®çµéãšãšãã«ããããã®è§£æŸãããªãã£ãã¡ã¢ãªãããã¯ãèç©ããããŸããŸãå€ãã®ã·ã¹ãã ãªãœãŒã¹ãæ¶è²»ããŸããWebã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã¡ã¢ãªãªãŒã¯ã¯æ¬¡ã®ããã«çŸããããšããããŸãïŒ
- ããã©ãŒãã³ã¹ã®äœäžïŒ ã¢ããªã±ãŒã·ã§ã³ãããå€ãã®ã¡ã¢ãªãæ¶è²»ããã«ã€ããŠãåäœãé ããªããå¿çæ§ãäœäžããŸãã
- ã¯ã©ãã·ã¥ïŒ æçµçã«ãã¢ããªã±ãŒã·ã§ã³ã¯ã¡ã¢ãªäžè¶³ã«é¥ãã¯ã©ãã·ã¥ãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®äœäžã«ã€ãªãããŸãã
- äºæãã¬åäœïŒ ã¡ã¢ãªãªãŒã¯ã¯ãã¢ããªã±ãŒã·ã§ã³å ã§äºæž¬äžå¯èœãªåäœããšã©ãŒãåŒãèµ·ããå¯èœæ§ããããŸãã
Reactã§ã¯ãã¡ã¢ãªãªãŒã¯ã¯éåææäœããµãã¹ã¯ãªãã·ã§ã³ããŸãã¯ã€ãã³ããªã¹ããŒãæ±ãéã«useEffect
ããã¯å
ã§ãã°ãã°çºçããŸãããããã®æäœãã³ã³ããŒãã³ãã®ã¢ã³ããŠã³ãæãåã¬ã³ããªã³ã°æã«é©åã«ã¯ãªãŒã³ã¢ãããããªãå Žåãããã¯ã°ã©ãŠã³ãã§å®è¡ããç¶ãããªãœãŒã¹ãæ¶è²»ããåé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã
useEffect
ãšå¯äœçšã®çè§£
ãšãã§ã¯ãã®ã¯ãªãŒã³ã¢ããã«å
¥ãåã«ãuseEffect
ã®ç®çãç°¡åã«åŸ©ç¿ããŸããããuseEffect
ããã¯ã䜿çšãããšã颿°ã³ã³ããŒãã³ãã§å¯äœçšãå®è¡ã§ããŸããå¯äœçšãšã¯ã以äžã®ãããªå€éšã®äžçãšçžäºäœçšããæäœã§ãïŒ
- APIããã®ããŒã¿ååŸ
- ãµãã¹ã¯ãªãã·ã§ã³ã®èšå®ïŒäŸïŒWebSocketãRxJS ObservableïŒ
- DOMã®çŽæ¥æäœ
- ã¿ã€ããŒã®èšå®ïŒäŸïŒ
setTimeout
ãsetInterval
ã®äœ¿çšïŒ - ã€ãã³ããªã¹ããŒã®è¿œå
useEffect
ããã¯ã¯2ã€ã®åŒæ°ãåãåããŸãïŒ
- å¯äœçšãå«ã颿°ã
- ïŒãªãã·ã§ãã«ãªïŒäŸåé åã
å¯äœçšé¢æ°ã¯ãã³ã³ããŒãã³ããã¬ã³ããªã³ã°ãããåŸã«å®è¡ãããŸããäŸåé
åã¯ããã€ãšãã§ã¯ããåå®è¡ããããReactã«äŒããŸããäŸåé
åã空ïŒ[]
ïŒã®å Žåããšãã§ã¯ãã¯ååã¬ã³ããªã³ã°åŸã«äžåºŠã ãå®è¡ãããŸããäŸåé
åãçç¥ãããå Žåããšãã§ã¯ãã¯ãã¹ãŠã®ã¬ã³ããªã³ã°åŸã«å®è¡ãããŸãã
ãšãã§ã¯ãã¯ãªãŒã³ã¢ããã®éèŠæ§
Reactã§ã¡ã¢ãªãªãŒã¯ãé²ãéµã¯ãäžèŠã«ãªã£ãå¯äœçšãã¯ãªãŒã³ã¢ããããããšã§ããããã§ã¯ãªãŒã³ã¢ãã颿°ãç»å ŽããŸããuseEffect
ããã¯ã§ã¯ãå¯äœçšé¢æ°ãã颿°ãè¿ãããšãã§ããŸãããã®è¿ããã颿°ãã¯ãªãŒã³ã¢ãã颿°ã§ãããã³ã³ããŒãã³ããã¢ã³ããŠã³ãããããšãããŸãã¯ïŒäŸåé¢ä¿ã®å€æŽã«ããïŒãšãã§ã¯ããåå®è¡ãããåã«å®è¡ãããŸãã
åºæ¬çãªäŸã以äžã«ç€ºããŸãïŒ
import React, { useState, useEffect } from 'react';
function MyComponent() {
const [count, setCount] = useState(0);
useEffect(() => {
console.log('Effect ran');
// This is the cleanup function
return () => {
console.log('Cleanup ran');
};
}, []); // Empty dependency array: runs only once on mount
return (
Count: {count}
);
}
export default MyComponent;
ãã®äŸã§ã¯ãconsole.log('Effect ran')
ã¯ã³ã³ããŒãã³ããããŠã³ãããããšãã«äžåºŠå®è¡ãããŸããconsole.log('Cleanup ran')
ã¯ã³ã³ããŒãã³ããã¢ã³ããŠã³ãããããšãã«å®è¡ãããŸãã
ãšãã§ã¯ãã¯ãªãŒã³ã¢ãããå¿ èŠãªäžè¬çãªã·ããªãª
ãšãã§ã¯ãã®ã¯ãªãŒã³ã¢ãããäžå¯æ¬ ãªããã€ãã®äžè¬çãªã·ããªãªãèŠãŠãããŸãããïŒ
1. ã¿ã€ããŒïŒsetTimeout
ãšsetInterval
ïŒ
useEffect
ããã¯ã§ã¿ã€ããŒã䜿çšããŠããå Žåãã³ã³ããŒãã³ããã¢ã³ããŠã³ãããããšãã«ããããã¯ãªã¢ããããšãäžå¯æ¬ ã§ããããããªããšãã¿ã€ããŒã¯ã³ã³ããŒãã³ãããªããªã£ãåŸãçºç«ãç¶ããã¡ã¢ãªãªãŒã¯ãæœåšçãªãšã©ãŒãåŒãèµ·ãããŸããäŸãã°ãäžå®ééã§çºæ¿ã¬ãŒããååŸããŠèªåæŽæ°ããé貚ã³ã³ããŒã¿ãŒãèããŠã¿ãŸãããïŒ
import React, { useState, useEffect } from 'react';
function CurrencyConverter() {
const [exchangeRate, setExchangeRate] = useState(0);
useEffect(() => {
const intervalId = setInterval(() => {
// Simulate fetching exchange rate from an API
const newRate = Math.random() * 1.2; // Example: Random rate between 0 and 1.2
setExchangeRate(newRate);
}, 2000); // Update every 2 seconds
return () => {
clearInterval(intervalId);
console.log('Interval cleared!');
};
}, []);
return (
Current Exchange Rate: {exchangeRate.toFixed(2)}
);
}
export default CurrencyConverter;
ãã®äŸã§ã¯ãsetInterval
ã䜿çšããŠ2ç§ããšã«exchangeRate
ãæŽæ°ããŠããŸããã¯ãªãŒã³ã¢ãã颿°ã¯clearInterval
ã䜿çšããŠãã³ã³ããŒãã³ããã¢ã³ããŠã³ãããããšãã«ã€ã³ã¿ãŒãã«ã忢ããã¿ã€ããŒãå®è¡ããç¶ããŠã¡ã¢ãªãªãŒã¯ãåŒãèµ·ããã®ãé²ããŸãã
2. ã€ãã³ããªã¹ããŒ
useEffect
ããã¯ã§ã€ãã³ããªã¹ããŒã远å ããå Žåãã³ã³ããŒãã³ããã¢ã³ããŠã³ãããããšãã«ããããåé€ããå¿
èŠããããŸãããããæ ããšãåãèŠçŽ ã«è€æ°ã®ã€ãã³ããªã¹ããŒãã¢ã¿ãããããäºæãã¬åäœãã¡ã¢ãªãªãŒã¯ã«ã€ãªããå¯èœæ§ããããŸããäŸãã°ãç»é¢ãµã€ãºã«åãããŠã¬ã€ã¢ãŠãã調æŽããããã«ãŠã£ã³ããŠã®ãªãµã€ãºã€ãã³ãããªãã¹ã³ããã³ã³ããŒãã³ããæ³åããŠã¿ãŠãã ããïŒ
import React, { useState, useEffect } from 'react';
function ResponsiveComponent() {
const [windowWidth, setWindowWidth] = useState(window.innerWidth);
useEffect(() => {
const handleResize = () => {
setWindowWidth(window.innerWidth);
};
window.addEventListener('resize', handleResize);
return () => {
window.removeEventListener('resize', handleResize);
console.log('Event listener removed!');
};
}, []);
return (
Window Width: {windowWidth}
);
}
export default ResponsiveComponent;
ãã®ã³ãŒãã¯ããŠã£ã³ããŠã«resize
ã€ãã³ããªã¹ããŒã远å ããŸããã¯ãªãŒã³ã¢ãã颿°ã¯removeEventListener
ã䜿çšããŠãã³ã³ããŒãã³ããã¢ã³ããŠã³ãããããšãã«ãªã¹ããŒãåé€ããã¡ã¢ãªãªãŒã¯ãé²ããŸãã
3. ãµãã¹ã¯ãªãã·ã§ã³ïŒWebSocketãRxJS Observableãªã©ïŒ
ã³ã³ããŒãã³ããWebSocketãRxJS ObservableããŸãã¯ä»ã®ãµãã¹ã¯ãªãã·ã§ã³ã¡ã«ããºã ã䜿çšããŠããŒã¿ã¹ããªãŒã ããµãã¹ã¯ã©ã€ãããå Žåãã³ã³ããŒãã³ããã¢ã³ããŠã³ãããããšãã«ãµãã¹ã¯ã©ã€ããè§£é€ããããšãäžå¯æ¬ ã§ãããµãã¹ã¯ãªãã·ã§ã³ãã¢ã¯ãã£ããªãŸãŸã«ããŠãããšãã¡ã¢ãªãªãŒã¯ãäžèŠãªãããã¯ãŒã¯ãã©ãã£ãã¯ã«ã€ãªããå¯èœæ§ããããŸãããªã¢ã«ã¿ã€ã ã®æ ªäŸ¡æ å ±ã®ããã«ã³ã³ããŒãã³ããWebSocketãã£ãŒãããµãã¹ã¯ã©ã€ãããäŸãèããŠã¿ãŸãããïŒ
import React, { useState, useEffect } from 'react';
function StockTicker() {
const [stockPrice, setStockPrice] = useState(0);
const [socket, setSocket] = useState(null);
useEffect(() => {
// Simulate creating a WebSocket connection
const newSocket = new WebSocket('wss://example.com/stock-feed');
setSocket(newSocket);
newSocket.onopen = () => {
console.log('WebSocket connected');
};
newSocket.onmessage = (event) => {
// Simulate receiving stock price data
const price = parseFloat(event.data);
setStockPrice(price);
};
newSocket.onclose = () => {
console.log('WebSocket disconnected');
};
newSocket.onerror = (error) => {
console.error('WebSocket error:', error);
};
return () => {
newSocket.close();
console.log('WebSocket closed!');
};
}, []);
return (
Stock Price: {stockPrice}
);
}
export default StockTicker;
ãã®ã·ããªãªã§ã¯ãã³ã³ããŒãã³ãã¯æ ªäŸ¡ãã£ãŒããžã®WebSocketæ¥ç¶ã確ç«ããŸããã¯ãªãŒã³ã¢ãã颿°ã¯socket.close()
ã䜿çšããŠãã³ã³ããŒãã³ããã¢ã³ããŠã³ãããããšãã«æ¥ç¶ãéããæ¥ç¶ãã¢ã¯ãã£ããªãŸãŸã«ãªã£ãŠã¡ã¢ãªãªãŒã¯ãåŒãèµ·ããã®ãé²ããŸãã
4. AbortControllerã䜿çšããããŒã¿ååŸ
useEffect
ã§ããŒã¿ãååŸããéãç¹ã«å¿çã«æéããããå¯èœæ§ã®ããAPIããååŸããå Žåããªã¯ãšã¹ããå®äºããåã«ã³ã³ããŒãã³ããã¢ã³ããŠã³ããããå Žåã«ãã§ãããªã¯ãšã¹ãããã£ã³ã»ã«ããããã«AbortController
ã䜿çšãã¹ãã§ããããã«ãããäžèŠãªãããã¯ãŒã¯ãã©ãã£ãã¯ããã¢ã³ããŠã³ããããã³ã³ããŒãã³ãã®ã¹ããŒããæŽæ°ããããšããŠçºçããæœåšçãªãšã©ãŒãé²ããŸãã以äžã¯ãŠãŒã¶ãŒããŒã¿ãååŸããäŸã§ãïŒ
import React, { useState, useEffect } from 'react';
function UserProfile() {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const controller = new AbortController();
const signal = controller.signal;
const fetchData = async () => {
try {
const response = await fetch('https://api.example.com/user', { signal });
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
setUser(data);
} catch (err) {
if (err.name === 'AbortError') {
console.log('Fetch aborted');
} else {
setError(err);
}
} finally {
setLoading(false);
}
};
fetchData();
return () => {
controller.abort();
console.log('Fetch aborted!');
};
}, []);
if (loading) {
return Loading...
;
}
if (error) {
return Error: {error.message}
;
}
return (
User Profile
Name: {user.name}
Email: {user.email}
);
}
export default UserProfile;
ãã®ã³ãŒãã¯AbortController
ã䜿çšããŠãããŒã¿ãååŸãããåã«ã³ã³ããŒãã³ããã¢ã³ããŠã³ããããå Žåã«ãã§ãããªã¯ãšã¹ããäžæããŸããã¯ãªãŒã³ã¢ãã颿°ã¯controller.abort()
ãåŒã³åºããŠãªã¯ãšã¹ãããã£ã³ã»ã«ããŸãã
useEffect
ã«ãããäŸåé¢ä¿ã®çè§£
useEffect
ã®äŸåé
åã¯ããšãã§ã¯ãããã€åå®è¡ãããããæ±ºå®ããäžã§éèŠãªåœ¹å²ãæãããŸãããŸããã¯ãªãŒã³ã¢ãã颿°ã«ã圱é¿ããŸããäºæãã¬åäœãé¿ããé©åãªã¯ãªãŒã³ã¢ããã確å®ã«ããããã«ã¯ãäŸåé¢ä¿ãã©ã®ããã«æ©èœããããçè§£ããããšãéèŠã§ãã
空ã®äŸåé
åïŒ[]
ïŒ
空ã®äŸåé
åïŒ[]
ïŒãæäŸãããšããšãã§ã¯ãã¯ååã¬ã³ããªã³ã°åŸã«äžåºŠã ãå®è¡ãããŸããã¯ãªãŒã³ã¢ãã颿°ã¯ãã³ã³ããŒãã³ããã¢ã³ããŠã³ãããããšãã«ã®ã¿å®è¡ãããŸããããã¯ãWebSocketæ¥ç¶ã®åæåãã°ããŒãã«ã€ãã³ããªã¹ããŒã®è¿œå ãªã©ãäžåºŠã ãèšå®ããå¿
èŠãããå¯äœçšã«äŸ¿å©ã§ãã
å€ãæã€äŸåé¢ä¿
å€ãå«ãäŸåé åãæäŸãããšãé åå ã®ããããã®å€ã倿Žããããã³ã«ãšãã§ã¯ããåå®è¡ãããŸããã¯ãªãŒã³ã¢ãã颿°ã¯ããšãã§ã¯ããåå®è¡ããã*å*ã«å®è¡ãããæ°ãããšãã§ã¯ããèšå®ããåã«åã®ãšãã§ã¯ããã¯ãªãŒã³ã¢ããããããšãã§ããŸããããã¯ããŠãŒã¶ãŒIDã«åºã¥ãããŒã¿ååŸãã³ã³ããŒãã³ãã®ã¹ããŒãã«åºã¥ãDOMã®æŽæ°ãªã©ãç¹å®ã®å€ã«äŸåããå¯äœçšã«ãšã£ãŠéèŠã§ãã
ãã®äŸãèããŠã¿ãŸãããïŒ
import React, { useState, useEffect } from 'react';
function DataFetcher({ userId }) {
const [data, setData] = useState(null);
useEffect(() => {
let didCancel = false;
const fetchData = async () => {
try {
const response = await fetch(`https://api.example.com/users/${userId}`);
const result = await response.json();
if (!didCancel) {
setData(result);
}
} catch (error) {
console.error('Error fetching data:', error);
}
};
fetchData();
return () => {
didCancel = true;
console.log('Fetch cancelled!');
};
}, [userId]);
return (
{data ? User Data: {data.name}
: Loading...
}
);
}
export default DataFetcher;
ãã®äŸã§ã¯ããšãã§ã¯ãã¯userId
ããããã£ã«äŸåããŠããŸããuserId
ã倿Žããããã³ã«ãšãã§ã¯ããåå®è¡ãããŸããã¯ãªãŒã³ã¢ãã颿°ã¯didCancel
ãã©ã°ãtrue
ã«èšå®ããã³ã³ããŒãã³ããã¢ã³ããŠã³ããããåŸãuserId
ã倿ŽãããåŸã«ãã§ãããªã¯ãšã¹ããå®äºããå Žåã«ã¹ããŒããæŽæ°ãããã®ãé²ããŸããããã«ããããCan't perform a React state update on an unmounted componentããšããèŠåãé²ããŸãã
äŸåé åã®çç¥ïŒæ³šæããŠäœ¿çšïŒ
äŸåé åãçç¥ãããšããšãã§ã¯ãã¯ãã¹ãŠã®ã¬ã³ããªã³ã°åŸã«å®è¡ãããŸããããã¯ããã©ãŒãã³ã¹ã®åé¡ãç¡éã«ãŒãã«ã€ãªããå¯èœæ§ããããããäžè¬çã«ã¯æšå¥šãããŸãããããããäŸåé¢ä¿ãšããŠæç€ºçã«ãªã¹ãããã«ãšãã§ã¯ãå ã§propsãstateã®ææ°ã®å€ã«ã¢ã¯ã»ã¹ããå¿ èŠãããå Žåãªã©ãçšãªã±ãŒã¹ã§å¿ èŠã«ãªãããšããããŸãã
éèŠïŒ äŸåé åãçç¥ããå Žåãå¯äœçšã®ã¯ãªãŒã³ã¢ããã«ã¯*现å¿ã®æ³šæ*ãæãå¿ èŠããããŸããã¯ãªãŒã³ã¢ãã颿°ã¯*ãã¹ãŠ*ã®ã¬ã³ããªã³ã°ã®åã«å®è¡ããããããéå¹ççã§ãããæ£ããåŠçãããªããšåé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã
ãšãã§ã¯ãã¯ãªãŒã³ã¢ããã®ãã¹ããã©ã¯ãã£ã¹
ãšãã§ã¯ãã¯ãªãŒã³ã¢ããã䜿çšããéã«åŸãã¹ããã¹ããã©ã¯ãã£ã¹ãããã€ã玹ä»ããŸãïŒ
- åžžã«å¯äœçšãã¯ãªãŒã³ã¢ããããïŒ å¿
èŠãªããšæã£ãŠããŠãã
useEffect
ããã¯ã«ã¯åžžã«ã¯ãªãŒã³ã¢ãã颿°ãå«ããç¿æ £ãã€ããŸããããåãããã°æããªãã§ãã - ã¯ãªãŒã³ã¢ãã颿°ãç°¡æœã«ä¿ã€ïŒ ã¯ãªãŒã³ã¢ãã颿°ã¯ããšãã§ã¯ã颿°ã§èšå®ãããç¹å®ã®å¯äœçšãã¯ãªãŒã³ã¢ãããã責任ã®ã¿ãè² ãã¹ãã§ãã
- äŸåé
åã§æ°ãã颿°ãäœæããªãïŒ ã³ã³ããŒãã³ãå
ã§æ°ãã颿°ãäœæãããããäŸåé
åã«å«ãããšãã¬ã³ããªã³ã°ã®ãã³ã«ãšãã§ã¯ããåå®è¡ãããŸããäŸåé¢ä¿ãšããŠäœ¿çšããã颿°ã¯
useCallback
ã§ã¡ã¢åããŸãããã - äŸåé¢ä¿ã«æ³šæããïŒ
useEffect
ããã¯ã®äŸåé¢ä¿ãæ éã«æ€èšããŠãã ããããšãã§ã¯ããäŸåãããã¹ãŠã®å€ãå«ããäžèŠãªå€ã¯å«ããªãããã«ããŸãããã - ã¯ãªãŒã³ã¢ãã颿°ããã¹ãããïŒ ã¯ãªãŒã³ã¢ãã颿°ãæ£ããæ©èœããã¡ã¢ãªãªãŒã¯ãé²ãã§ããããšã確èªããããã«ãã¹ããæžããŸãããã
ã¡ã¢ãªãªãŒã¯ãæ€åºããããã®ããŒã«
Reactã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªãªãŒã¯ãæ€åºããã®ã«åœ¹ç«ã€ããŒã«ãããã€ããããŸãïŒ
- React Developer ToolsïŒ React Developer Toolsãã©ãŠã¶æ¡åŒµæ©èœã«ã¯ãããã©ãŒãã³ã¹ã®ããã«ããã¯ãã¡ã¢ãªãªãŒã¯ãç¹å®ããã®ã«åœ¹ç«ã€ãããã¡ã€ã©ãå«ãŸããŠããŸãã
- Chrome DevTools Memory PanelïŒ Chrome DevToolsã«ã¯ãããŒãã¹ãããã·ã§ãããååŸããŠã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªäœ¿çšéãåæã§ããã¡ã¢ãªããã«ãçšæãããŠããŸãã
- LighthouseïŒ Lighthouseã¯ãWebããŒãžã®å質ãåäžãããããã®èªåããŒã«ã§ããããã©ãŒãã³ã¹ãã¢ã¯ã»ã·ããªãã£ããã¹ããã©ã¯ãã£ã¹ãSEOã®ç£æ»ãå«ãŸããŠããŸãã
- npmããã±ãŒãžïŒäŸïŒ
why-did-you-render
ïŒïŒ ãããã®ããã±ãŒãžã¯ãäžèŠãªåã¬ã³ããªã³ã°ãç¹å®ããã®ã«åœ¹ç«ã¡ãŸããããã¯æã«ã¡ã¢ãªãªãŒã¯ã®å åã§ããããšããããŸãã
çµè«
Reactãšãã§ã¯ãã®ã¯ãªãŒã³ã¢ããããã¹ã¿ãŒããããšã¯ãå ç¢ã§ãããã©ãŒãã³ã¹ãé«ããã¡ã¢ãªå¹çã®è¯ãReactã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«äžå¯æ¬ ã§ãããã®ã¬ã€ãã§æŠèª¬ããããšãã§ã¯ãã¯ãªãŒã³ã¢ããã®ååãçè§£ãããã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãã¡ã¢ãªãªãŒã¯ãé²ããã¹ã ãŒãºãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã確ä¿ã§ããŸããåžžã«å¯äœçšãã¯ãªãŒã³ã¢ããããäŸåé¢ä¿ã«æ³šæãæããå©çšå¯èœãªããŒã«ã䜿çšããŠã³ãŒãå ã®æœåšçãªã¡ã¢ãªãªãŒã¯ãæ€åºããŠå¯ŸåŠããããšãå¿ããªãã§ãã ããã
ãããã®æè¡ãç±å¿ã«é©çšããããšã§ãReactéçºã¹ãã«ãåäžãããæ©èœçã§ããã ãã§ãªããããã©ãŒãã³ã¹ãé«ãä¿¡é Œæ§ã®ããã¢ããªã±ãŒã·ã§ã³ãäœæããäžçäžã®ãŠãŒã¶ãŒã«ãšã£ãŠããè¯ãå šäœçãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«è²¢ç®ããããšãã§ããŸãããã®ã¡ã¢ãªç®¡çãžã®ç©æ¥µçãªã¢ãããŒãã¯ãçµéšè±å¯ãªéçºè ãéç«ãããReactãããžã§ã¯ãã®é·æçãªä¿å®æ§ãšã¹ã±ãŒã©ããªãã£ãä¿èšŒããŸãã